package com.mt.roll.core.utils;

import cn.afterturn.easypoi.excel.entity.ImportParams;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.InputStream;
import java.util.List;
import java.util.NoSuchElementException;

/**
 * <p>
 *     excel导入工具类
 * </p>
 *
 * @author Mr.ZhangShi
 * @version 1.0
 * @date 2019/10/17
 */
public class ExcelImportUtil {

    /**
     * excel默认文件导入
     * @param file 文件
     * @param pojoClass 导出实体的class
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(File file, Class<T> pojoClass) {
        return importExcel(file, pojoClass, 0, 1, 0, 0, 1, false, false, null);
    }

    /**
     * excel默认流导入
     * @param inputstream 流
     * @param pojoClass 导出实体的class
     * @param <T>
     * @return
     * @throws Exception
     */
    public static <T> List<T> importExcel(InputStream inputstream, Class<T> pojoClass) throws Exception {
        return importExcel(inputstream, pojoClass, 0, 1, 0, 0, 1, false, false, null);
    }

    /**
     * excel文件导入
     * @param file 文件
     * @param pojoClass 导出实体的class
     * @param titleRows 表格标题行数,默认0
     * @param headRows 表头行数,默认1
     * @param startRows 字段真正值和列标题之间的距离 默认0
     * @param startSheetIndex 开始读取的sheet位置,默认为0
     * @param sheetNum 上传表格需要读取的sheet 数量,默认为1
     * @param needSave 是否需要保存上传的Excel
     * @param needVerify 是否需要校验上传的Excel
     * @param saveUrl 保存上传的Excel目录
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(File file, Class<T> pojoClass, int titleRows, int headRows, int startRows, int startSheetIndex, int sheetNum, boolean needSave, boolean needVerify,
                                          String saveUrl) {
        ImportParams params = new ImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headRows);
        params.setStartRows(startRows);
        params.setStartSheetIndex(startSheetIndex);
        params.setSheetNum(sheetNum);
        params.setNeedSave(needSave);
        params.setNeedVerify(needVerify);
        params.setSaveUrl(saveUrl);
        return cn.afterturn.easypoi.excel.ExcelImportUtil.importExcel(file, pojoClass, params);
    }

    /**
     * excel文件导入
     * @param file 文件
     * @param titleRows 表格标题行数,默认0
     * @param headerRows 表头行数,默认1
     * @param startSheetNum 开始读取的sheet位置,默认为0,,第一sheet是从0开始的
     * @param sheetNum 上传表格需要读取的sheet 数量,默认为1
     * @param pojoClass 导出实体的class
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(MultipartFile file,
                                          Integer titleRows,
                                          Integer headerRows,
                                          Integer startSheetNum,
                                          Integer sheetNum,
                                          Class<T> pojoClass) {
        if (file == null) {
            return null;
        }
        ImportParams params = new ImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headerRows);
        params.setStartSheetIndex(startSheetNum);
        params.setSheetNum(sheetNum);
        params.setKeyIndex(null);
        List<T> list = null;
        try {
            list = cn.afterturn.easypoi.excel.ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);
        } catch (NoSuchElementException e) {
            throw new RuntimeException("excel文件不能为空");
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
        return list;
    }

    /**
     * excel流导入
     * @param inputstream 流
     * @param pojoClass 导出实体的class
     * @param titleRows 表格标题行数,默认0
     * @param headRows 表头行数,默认1
     * @param startRows 字段真正值和列标题之间的距离 默认0
     * @param startSheetIndex 开始读取的sheet位置,默认为0
     * @param sheetNum 上传表格需要读取的sheet 数量,默认为1
     * @param needSave 是否需要保存上传的Excel
     * @param needVerify 是否需要校验上传的Excel
     * @param saveUrl 保存上传的Excel目录
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(InputStream inputstream,  Class<T> pojoClass, int titleRows, int headRows, int startRows, int startSheetIndex, int sheetNum, boolean needSave, boolean needVerify,
                                          String saveUrl) throws Exception{
        ImportParams params = new ImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headRows);
        params.setStartRows(startRows);
        params.setStartSheetIndex(startSheetIndex);
        params.setSheetNum(sheetNum);
        params.setNeedSave(needSave);
        params.setNeedVerify(needVerify);
        params.setSaveUrl(saveUrl);
        return cn.afterturn.easypoi.excel.ExcelImportUtil.importExcel(inputstream, pojoClass, params);
    }
}
